/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package camada.bancodedados.daoimplemente.carro;

import camada.bancodedados.conexao.Conexao;
import camada.negocio.dao.carro.CarroDAO;
import com.mysql.jdbc.PreparedStatement;
import eloma.classe.carro.Abastecimento;
import eloma.classe.carro.Carro;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import utilitarios.Exceptions;

/**
 *
 * @author Icaro
 */
public class CarroDAOImpl implements CarroDAO {

    Exceptions exception = new Exceptions();

    //<editor-fold desc="Métodos do Carro">
    @Override
    //<editor-fold desc="inserirCarro">
    public void inserirCarro(Carro carro) {
        PreparedStatement pstm = null;
        try {
            final String SQL_INSERT
                    = "insert into Carro (placa,modelo,fabricante,anoModelo,anoFabricacao) values (?,?,?,?,?)";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_INSERT);
            pstm.setString(1, carro.getPlaca());
            pstm.setString(2, carro.getModelo());
            pstm.setString(3, carro.getFabricante());
            pstm.setInt(4, carro.getAnoModelo());
            pstm.setInt(5, carro.getAnoFabricacao());
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "CarroDAOImpl - inserirCarro");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="atualizarAgenda">
    public void atualizarAgenda(Carro carro) {
        PreparedStatement pstm = null;
        try {
            final String SQL_UPDATE
                    = "UPDATE Carro SET placa = ?,modelo = ?,fabricante = ?,anoModelo = ?,anoFabricacao = ? where idCarro = ? ";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_UPDATE);
            pstm.setString(1, carro.getPlaca());
            pstm.setString(2, carro.getModelo());
            pstm.setString(3, carro.getFabricante());
            pstm.setInt(4, carro.getAnoModelo());
            pstm.setInt(5, carro.getAnoFabricacao());
            pstm.setInt(6, carro.getIdCarro());
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "CarroDAOImpl - atualizarAgenda");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="removerCarro">
    public void removerCarro(int idCarro) {
        PreparedStatement pstm = null;
        try {
            final String SQL_DELETE = "delete from Carro where idCarro = ?";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_DELETE);
            pstm.setInt(1, idCarro);
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "CarroDAOImpl - removerCarro");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="selecionarCarro">
    public List<Carro> selecionarCarro() throws Exception {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String SELECT_SAIDACHEQUE = "Select * from Carro";
        try {
            stmt = (PreparedStatement) Conexao.getCon().prepareStatement(SELECT_SAIDACHEQUE);
            rs = stmt.executeQuery();
            return carregarVariosResultados(rs);
        } catch (SQLException sqle) {
            exception.Exceptions(sqle.getMessage().toString(), "CarroDAOImpl - selecionarCarro");
            throw new Exception(sqle);
        } catch (Exception e) {
            exception.Exceptions(e.getMessage().toString(), "CarroDAOImpl - selecionarCarro");
            throw new Exception(e);
        } finally {
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="selecionarCarroPorId">
    public Carro selecionarCarroPorId(int idCarro) throws Exception {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String SELECT_SAIDACHEQUE = "Select * from Carro where IdCarro = ?";
        try {
            stmt = (PreparedStatement) Conexao.getCon().prepareStatement(SELECT_SAIDACHEQUE);
            stmt.setInt(1, idCarro);
            rs = stmt.executeQuery();
            return carregarSimpleResultado(rs);
        } catch (SQLException sqle) {
            exception.Exceptions(sqle.getMessage().toString(), "CarroDAOImpl - selecionarCarro");
            throw new Exception(sqle);
        } catch (Exception e) {
            exception.Exceptions(e.getMessage().toString(), "CarroDAOImpl - selecionarCarro");
            throw new Exception(e);
        } finally {
        }
    }
    //</editor-fold>

    //<editor-fold desc="Metódos para carregar listas">
    public List<Carro> carregarVariosResultados(ResultSet rs) throws SQLException {
        List<Carro> resultList = new ArrayList<Carro>();
        while (rs.next()) {
            Carro dto = new Carro();
            carregarVO(dto, rs);
            resultList.add(dto);
        }
        return resultList;
    }

    private Carro carregarSimpleResultado(ResultSet rs) throws SQLException {
        if (rs.next()) {
            Carro dto = new Carro();
            carregarVO(dto, rs);
            return dto;
        } else {
            return null;
        }
    }

    private void carregarVO(Carro dto, ResultSet rs) throws SQLException {
        dto.setIdCarro(rs.getInt("IdCarro"));
        dto.setPlaca(rs.getString("Placa"));
        dto.setModelo(rs.getString("Modelo"));
        dto.setFabricante(rs.getString("Fabricante"));
        dto.setAnoModelo(rs.getInt("AnoModelo"));
        dto.setAnoFabricacao(rs.getInt("AnoFabricacao"));
    }
    //</editor-fold>

    //</editor-fold>
    //<editor-fold desc="Métodos do Abastecimento">
    @Override
    //<editor-fold desc="inserirAbasteciemtno">
    public void inserirAbasteciemtno(Abastecimento abastecimento) {
        PreparedStatement pstm = null;
        try {
            final String SQL_INSERT
                    = "insert into Abastecimento (idCarro,data,quantidade,valor,km,mes,ano) values (?,?,?,?,?,?,?)";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_INSERT);
            pstm.setInt(1, abastecimento.getCarro().getIdCarro());
            pstm.setString(2, abastecimento.getData());
            pstm.setFloat(3, abastecimento.getQuantidade());
            pstm.setFloat(4, abastecimento.getValor());
            pstm.setFloat(5, abastecimento.getKm());
            pstm.setInt(6, abastecimento.getMes());
            pstm.setInt(7, abastecimento.getAno());
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "CarroDAOImpl - inserirCarro");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="atualizarAgenda">
    public void atualizarAbastecimento(Abastecimento abastecimento) {
        PreparedStatement pstm = null;
        try {
            final String SQL_UPDATE
                    = "UPDATE Abastecimento SET idCarro = ?,data = ?,quantidade = ?,valor = ?,km = ?,mes = ?,ano = ? where idAbastecimento = ? ";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_UPDATE);
            pstm.setInt(1, abastecimento.getCarro().getIdCarro());
            pstm.setString(2, abastecimento.getData());
            pstm.setFloat(3, abastecimento.getQuantidade());
            pstm.setFloat(4, abastecimento.getValor());
            pstm.setFloat(5, abastecimento.getKm());
            pstm.setInt(6, abastecimento.getMes());
            pstm.setInt(7, abastecimento.getAno());
            pstm.setInt(8, abastecimento.getIdAbastecimento());
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "CarroDAOImpl - atualizarAgenda");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="removerAbastecimento">
    public void removerAbastecimento(int idAbastecimento) {
        PreparedStatement pstm = null;
        try {
            final String SQL_DELETE = "delete from Abastecimento where idAbastecimento = ?";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_DELETE);
            pstm.setInt(1, idAbastecimento);
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "CarroDAOImpl - removerCarro");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="selecionarCarroPorId">
    public List<Abastecimento> selecionarAbastecimentoPorIdCarro(int idCarro) throws Exception {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String SELECT_SAIDACHEQUE = "Select * from Abastecimento where IdCarro = ?";
        try {
            stmt = (PreparedStatement) Conexao.getCon().prepareStatement(SELECT_SAIDACHEQUE);
            stmt.setInt(1, idCarro);
            rs = stmt.executeQuery();
            return carregarVariosResultadosAbastecimento(rs);
        } catch (SQLException sqle) {
            exception.Exceptions(sqle.getMessage().toString(), "CarroDAOImpl - selecionarCarro");
            throw new Exception(sqle);
        } catch (Exception e) {
            exception.Exceptions(e.getMessage().toString(), "CarroDAOImpl - selecionarCarro");
            throw new Exception(e);
        } finally {
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="selecionarCarroPorId">
    public List<Abastecimento> selecionarAbastecimentoPorIdCarroMesAno(int idCarro, int mes, int ano) throws Exception {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String SELECT_SAIDACHEQUE = "Select * from Abastecimento where IdCarro = ? ans Mes = ? and Ano = ?";
        try {
            stmt = (PreparedStatement) Conexao.getCon().prepareStatement(SELECT_SAIDACHEQUE);
            stmt.setInt(1, idCarro);
            stmt.setInt(2, mes);
            stmt.setInt(3, ano);
            rs = stmt.executeQuery();
            return carregarVariosResultadosAbastecimento(rs);
        } catch (SQLException sqle) {
            exception.Exceptions(sqle.getMessage().toString(), "CarroDAOImpl - selecionarCarro");
            throw new Exception(sqle);
        } catch (Exception e) {
            exception.Exceptions(e.getMessage().toString(), "CarroDAOImpl - selecionarCarro");
            throw new Exception(e);
        } finally {
        }
    }
    //</editor-fold>

    //<editor-fold desc="Metódos para carregar listas">
    public List<Abastecimento> carregarVariosResultadosAbastecimento(ResultSet rs) throws SQLException {
        List<Abastecimento> resultList = new ArrayList<Abastecimento>();
        while (rs.next()) {
            Abastecimento dto = new Abastecimento();
            carregarVO(dto, rs);
            resultList.add(dto);
        }
        return resultList;
    }

    private Abastecimento carregarSimpleResultadoAbastecimento(ResultSet rs) throws SQLException {
        if (rs.next()) {
            Abastecimento dto = new Abastecimento();
            carregarVO(dto, rs);
            return dto;
        } else {
            return null;
        }
    }

    private void carregarVO(Abastecimento dto, ResultSet rs) throws SQLException {

        try {
            dto.setIdAbastecimento(rs.getInt("IdAbastecimento"));
            Carro carro = this.selecionarCarroPorId(rs.getInt("idCarro"));
            dto.setCarro(carro);

            dto.setData(rs.getString("Data"));
            dto.setQuantidade(rs.getFloat("Quantidade"));
            dto.setValor(rs.getFloat("Valor"));
            dto.setKm(rs.getFloat("Km"));
            dto.setAno(rs.getInt("ano"));
            dto.setMes(rs.getInt("mes"));
        } catch (Exception e) {
        }
    }
    //</editor-fold>

     //</editor-fold>
}
